<?php

declare(strict_types=1);

namespace App\Config\Model;

use App\Lib\AdminEnum;
use Mine\MineModel;

/**
 * @property int $id
 * @property int $source_type 类型(1.csgo,2.商品)
 * @property int $price 销售价格
 * @property int $origin_price 采购价格
 * @property int $rmb_price 人民币价格
 * @property string $name 产品名称
 * @property string $origin_name 商品原名称
 * @property string $english_name 英文名称
 * @property string $introduce 描述与介绍
 * @property string $cover 商品图片
 * @property int $stock 库存
 * @property string $tag_exterior 外部标签
 * @property string $tag_internal 内部标签
 * @property int $rate_inside 内部概率
 * @property int $rate_out 外部概率
 * @property int $category_id 分类ID
 * @property string $category_name 分类名称
 * @property string $item_id 唯一值（对应三方键值）
 * @property string $extend_field 扩展字段
 * @property int $up_status 上下架（1上架,2下架）
 * @property string $grade 物品等级
 * @property int $status 状态(1正常,2关闭)
 * @property int $created_by 创建者
 * @property int $create_time 创建时间
 * @property int $update_time 更新时间
 * @property int $delete_time
 */
class ConfigProduct extends MineModel
{
    const SOURCE_TYPE_CSGO = 1;
    const SOURCE_TYPE_GOODS = 2;

    protected ?string $dateFormat = 'U';
    const CREATED_AT = 'create_time';
    const UPDATED_AT = 'update_time';
    /**
     * The table associated with the model.
     */
    protected ?string $table = 'config_product';

    /**
     * The attributes that are mass assignable.
     */
    protected array $fillable = ['id', 'source_type', 'price', 'origin_price', 'rmb_price', 'name', 'origin_name', 'english_name', 'introduce', 'cover', 'stock', 'tag_exterior', 'tag_internal', 'rate_inside', 'rate_out', 'category_id', 'category_name', 'item_id', 'extend_field', 'up_status', 'grade', 'status', 'created_by', 'create_time', 'update_time', 'delete_time'];

    /**
     * The attributes that should be cast to native types.
     */
    protected array $casts = ['id' => 'integer', 'source_type' => 'integer', 'price' => 'integer', 'origin_price' => 'integer', 'rmb_price' => 'integer', 'stock' => 'integer', 'rate_inside' => 'integer', 'rate_out' => 'integer', 'category_id' => 'integer', 'up_status' => 'integer', 'status' => 'integer', 'created_by' => 'integer', 'create_time' => 'integer', 'update_time' => 'integer', 'delete_time' => 'integer'];

    public function getPriceAttribute($value)
    {
        return number_format($value / AdminEnum::PRICE_MULTIPLE, 2, '.', '');
    }


    public function setPriceAttribute($value)
    {
        $this->attributes['price'] = (int)($value * AdminEnum::PRICE_MULTIPLE);
    }

    public function getOriginPriceAttribute($value)
    {
        return number_format($value / AdminEnum::PRICE_MULTIPLE, 2, '.', '');
    }


    public function setOriginPriceAttribute($value)
    {
        $this->attributes['origin_price'] = (int)($value * AdminEnum::PRICE_MULTIPLE);
    }


    public function getMaxPriceAttribute($value)
    {
        return number_format($value / AdminEnum::PRICE_MULTIPLE, 2, '.', '');
    }


    public function setMaxPriceAttribute($value)
    {
        $this->attributes['max_price'] = (int)($value * AdminEnum::PRICE_MULTIPLE);
    }

    /**
     * 获取最接近价格产品
     * @param $maxPrice
     * @return ConfigProduct|\Hyperf\Database\Model\Builder|\Hyperf\Database\Model\Model|\Hyperf\Database\Query\Builder|object|null
     */
    public static function getProductByNearPrice($maxPrice)
    {
        $query = ConfigProduct::query();
        $query->where('price', '>', 0)
            ->where('stock', '>', 5)
            ->whereIn('category_name', ['匕首', '步枪', '机枪', '狙击步枪', '手枪', '手套', '微型冲锋枪', '霰弹枪']); //固定8种类型
        $res = $query->where('price', '<', $maxPrice)
            ->orderBy('price', 'desc')
            ->first();
        return $res;
    }
}
